﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Elysium.Demo;
using SIIE_ERP.Codigo;
using SIIE_ERP.View;
using System.Windows.Controls.Primitives;
using SIIE_ERP.Codigo.PuntoVenta;
using SIIE_ERP.BaseDatos.Inventarios.Catalogos;
using System.Data;
using SIIE_ERP.BaseDatos;
using System.Globalization;
using Elysium.Demo.Controls;
using System.Printing;
using System.Windows.Xps;
using SIIE_ERP.BaseDatos.Configuracion;
using Elysium.Demo.Ventas;

namespace Elysium.Demo.PuntoVenta.Transacciones
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class Consola_Alta : UserControl
    {
        private UsuarioActivo _sesion;
        private bool _IsOpenMessageBox;
        private string Digitos;
        private string TicketNo;
        private int Id_Apertura;
        private string _texto, secuenciaT, CodigoBarra, codigoAddon;
        private ArticuloPuntoVenta Articulo_Frecuente1 = new ArticuloPuntoVenta();
        private ArticuloPuntoVenta Articulo_Frecuente2 = new ArticuloPuntoVenta();
        private ArticuloPuntoVenta Articulo_Frecuente3 = new ArticuloPuntoVenta();
        private ArticuloPuntoVenta Articulo_Frecuente4 = new ArticuloPuntoVenta();
        private ArticuloPuntoVenta Articulo_Frecuente5 = new ArticuloPuntoVenta();

        dbo_Cat_Articulo cat_a;

        public Consola_Alta(ref UsuarioActivo usuario)
        {
            InitializeComponent();
            this._sesion = usuario;

            //Mostramos el botón de TA
            if (dbo_Trans_TiempoAire_RFC.IsTiempoAireActivo(_sesion.RFC))
            {
                if (!dbo_Trans_TiempoAire_RFC.IsTiempoAireInProcess(_sesion.RFC))
                {
                    if (WebServicesClass.CheckConnection())
                        ButtonTA.IsEnabled = true;
                }
            }  
            
            CargarCombos();
            CargarDatos();

            Combo_ArticulosAutoComplete.Focus();
        }

        private void CargarCombos()
        {
            //Tarjetas
            ComboBoxUI.ComboTC(ref ComboTarjetas, _sesion);

            //Artículos
            ComboBoxUI.ComboArticulos_AutoComplete_Ventas(ref Combo_ArticulosAutoComplete, _sesion, "");

            Combo_ArticulosAutoComplete.Focus();

            //if (Combo_ArticulosAutoComplete.Items.Count > 0)
            //    Combo_ArticulosAutoComplete.SelectedIndex = 0;
        }

        private void CargarDatos()
        {
            cat_a = new dbo_Cat_Articulo(_sesion.RFC, _sesion.UserName);
            CargarProductosFrecuentes();

            this.TicketNo = FuncionesClass.getNewUNID().ToString();

            Label_Encabezado.Text = FuncionesClass.GetCabeceraTicket(_sesion.RFC, _sesion.UserName, _sesion.PV_Id_Terminal) + "\nTicket No.: " + this.TicketNo;

            Combo_ArticulosAutoComplete.Focus();
        }

        private void CargarProductosFrecuentes()
        {            
            DataTable dt_cat_a = cat_a.Get_Articulos_PuntoVenta();

            try
            {
                Articulo_Frecuente1.Clave = dt_cat_a.Rows[0]["Clave"].ToString();
                Articulo_Frecuente1.Codigo_Barras = dt_cat_a.Rows[0]["Codigo_Barras"].ToString();
                Articulo_Frecuente1.Id_Articulo = Int32.Parse(dt_cat_a.Rows[0]["Id_Articulo"].ToString());
                Articulo_Frecuente1.Id_Moneda = Int32.Parse(dt_cat_a.Rows[0]["Id_Moneda"].ToString());
                Articulo_Frecuente1.Marca = dt_cat_a.Rows[0]["Marca"].ToString();
                Articulo_Frecuente1.NombreTicket = dt_cat_a.Rows[0]["NombreTicket"].ToString();
                Articulo_Frecuente1.Porc_IVA = Math.Round(Double.Parse(dt_cat_a.Rows[0]["Desc_IVA"].ToString()),2);
                Articulo_Frecuente1.Precio_Lista = Math.Round(Double.Parse(dt_cat_a.Rows[0]["Precio_Lista"].ToString()) / Double.Parse(dt_cat_a.Rows[0]["Desc_TipoCambio"].ToString()), 2);
                Articulo_Frecuente1.Tipo_Articulo = Int32.Parse(dt_cat_a.Rows[0]["Tipo_Articulo"].ToString());
                Articulo_Frecuente1.TopVentas = Int32.Parse(dt_cat_a.Rows[0]["TopVentas"].ToString());

                TextBlock_Button_Productos1.Text = dt_cat_a.Rows[0]["NombreTicket"].ToString();
            }
            catch(Exception Ex)
            {
                Button_Productos1.Visibility = System.Windows.Visibility.Hidden;
            }

            try
            {
                Articulo_Frecuente2.Clave = dt_cat_a.Rows[1]["Clave"].ToString();
                Articulo_Frecuente2.Codigo_Barras = dt_cat_a.Rows[1]["Codigo_Barras"].ToString();
                Articulo_Frecuente2.Id_Articulo = Int32.Parse(dt_cat_a.Rows[1]["Id_Articulo"].ToString());
                Articulo_Frecuente2.Id_Moneda = Int32.Parse(dt_cat_a.Rows[1]["Id_Moneda"].ToString());
                Articulo_Frecuente2.Marca = dt_cat_a.Rows[1]["Marca"].ToString();
                Articulo_Frecuente2.NombreTicket = dt_cat_a.Rows[1]["NombreTicket"].ToString();
                Articulo_Frecuente2.Porc_IVA = Math.Round(Double.Parse(dt_cat_a.Rows[1]["Desc_IVA"].ToString()),2);
                Articulo_Frecuente2.Precio_Lista = Math.Round(Double.Parse(dt_cat_a.Rows[1]["Precio_Lista"].ToString()) / Double.Parse(dt_cat_a.Rows[1]["Desc_TipoCambio"].ToString()), 2);
                Articulo_Frecuente2.Tipo_Articulo = Int32.Parse(dt_cat_a.Rows[1]["Tipo_Articulo"].ToString());
                Articulo_Frecuente2.TopVentas = Int32.Parse(dt_cat_a.Rows[1]["TopVentas"].ToString());

                TextBlock_Button_Productos2.Text = dt_cat_a.Rows[1]["NombreTicket"].ToString();
            }
            catch (Exception Ex)
            {
                Button_Productos2.Visibility = System.Windows.Visibility.Hidden;
            }

            try
            {
                Articulo_Frecuente3.Clave = dt_cat_a.Rows[2]["Clave"].ToString();
                Articulo_Frecuente3.Codigo_Barras = dt_cat_a.Rows[2]["Codigo_Barras"].ToString();
                Articulo_Frecuente3.Id_Articulo = Int32.Parse(dt_cat_a.Rows[2]["Id_Articulo"].ToString());
                Articulo_Frecuente3.Id_Moneda = Int32.Parse(dt_cat_a.Rows[2]["Id_Moneda"].ToString());
                Articulo_Frecuente3.Marca = dt_cat_a.Rows[2]["Marca"].ToString();
                Articulo_Frecuente3.NombreTicket = dt_cat_a.Rows[2]["NombreTicket"].ToString();
                Articulo_Frecuente3.Porc_IVA = Math.Round(Double.Parse(dt_cat_a.Rows[2]["Desc_IVA"].ToString()),2);
                Articulo_Frecuente3.Precio_Lista = Math.Round(Double.Parse(dt_cat_a.Rows[2]["Precio_Lista"].ToString()) / Double.Parse(dt_cat_a.Rows[2]["Desc_TipoCambio"].ToString()),2);
                Articulo_Frecuente3.Tipo_Articulo = Int32.Parse(dt_cat_a.Rows[2]["Tipo_Articulo"].ToString());
                Articulo_Frecuente3.TopVentas = Int32.Parse(dt_cat_a.Rows[2]["TopVentas"].ToString());

                TextBlock_Button_Productos3.Text = dt_cat_a.Rows[2]["NombreTicket"].ToString();
            }
            catch (Exception Ex)
            {
                Button_Productos3.Visibility = System.Windows.Visibility.Hidden;
            }

            try
            {
                Articulo_Frecuente4.Clave = dt_cat_a.Rows[3]["Clave"].ToString();
                Articulo_Frecuente4.Codigo_Barras = dt_cat_a.Rows[3]["Codigo_Barras"].ToString();
                Articulo_Frecuente4.Id_Articulo = Int32.Parse(dt_cat_a.Rows[3]["Id_Articulo"].ToString());
                Articulo_Frecuente4.Id_Moneda = Int32.Parse(dt_cat_a.Rows[3]["Id_Moneda"].ToString());
                Articulo_Frecuente4.Marca = dt_cat_a.Rows[3]["Marca"].ToString();
                Articulo_Frecuente4.NombreTicket = dt_cat_a.Rows[3]["NombreTicket"].ToString();
                Articulo_Frecuente4.Porc_IVA = Math.Round(Double.Parse(dt_cat_a.Rows[3]["Desc_IVA"].ToString()),2);
                Articulo_Frecuente4.Precio_Lista = Math.Round(Double.Parse(dt_cat_a.Rows[3]["Precio_Lista"].ToString()) / Double.Parse(dt_cat_a.Rows[3]["Desc_TipoCambio"].ToString()),2);
                Articulo_Frecuente4.Tipo_Articulo = Int32.Parse(dt_cat_a.Rows[3]["Tipo_Articulo"].ToString());
                Articulo_Frecuente4.TopVentas = Int32.Parse(dt_cat_a.Rows[3]["TopVentas"].ToString());

                TextBlock_Button_Productos4.Text = dt_cat_a.Rows[3]["NombreTicket"].ToString();
            }
            catch (Exception Ex)
            {
                Button_Productos4.Visibility = System.Windows.Visibility.Hidden;
            }


            try
            {
                Articulo_Frecuente5.Clave = dt_cat_a.Rows[4]["Clave"].ToString();
                Articulo_Frecuente5.Codigo_Barras = dt_cat_a.Rows[4]["Codigo_Barras"].ToString();
                Articulo_Frecuente5.Id_Articulo = Int32.Parse(dt_cat_a.Rows[4]["Id_Articulo"].ToString());
                Articulo_Frecuente5.Id_Moneda = Int32.Parse(dt_cat_a.Rows[4]["Id_Moneda"].ToString());
                Articulo_Frecuente5.Marca = dt_cat_a.Rows[4]["Marca"].ToString();
                Articulo_Frecuente5.NombreTicket = dt_cat_a.Rows[4]["NombreTicket"].ToString();
                Articulo_Frecuente5.Porc_IVA = Math.Round(Double.Parse(dt_cat_a.Rows[4]["Desc_IVA"].ToString()));
                Articulo_Frecuente5.Precio_Lista = Math.Round(Double.Parse(dt_cat_a.Rows[4]["Precio_Lista"].ToString()) / Double.Parse(dt_cat_a.Rows[4]["Desc_TipoCambio"].ToString()), 2);
                Articulo_Frecuente5.Tipo_Articulo = Int32.Parse(dt_cat_a.Rows[4]["Tipo_Articulo"].ToString());
                Articulo_Frecuente5.TopVentas = Int32.Parse(dt_cat_a.Rows[4]["TopVentas"].ToString());

                TextBlock_Button_Productos5.Text = dt_cat_a.Rows[4]["NombreTicket"].ToString();
            }
            catch (Exception Ex)
            {
                Button_Productos5.Visibility = System.Windows.Visibility.Hidden;
            }
        }

        private void ButtonInformacion_Click_1(object sender, RoutedEventArgs e)
        {
            WindowAyuda Ayuda = new Elysium.Demo.WindowAyuda("Consola.htm", "Ayuda");
            Ayuda.Owner = SIIE_ERP.View.NavegacionUI.GetParentWindow(this); Ayuda.ShowDialog();
        }

        private void ButtonTA_Efectivo_Checked_1(object sender, RoutedEventArgs e)
        {
            if (ButtonTA_Tarjeta != null)
            {
                if ((bool)(sender as ToggleButton).IsChecked)
                {
                    // Code for Checked state
                    ButtonTA_Tarjeta.IsChecked = false;
                    TextBox_Importe.IsEnabled = true;
                    ComboTarjetas.IsEnabled = false;
                }
                else
                {
                    int isNum;
                    do
                    {
                        Digitos = Microsoft.VisualBasic.Interaction.InputBox("Favor de insertar los últimos 4 dígitos de la tarjeta con la que se va a cobrar", "Dígitos tarjeta", "");
                        if (String.IsNullOrEmpty(Digitos.Trim()))
                        {
                            return;
                        }
                    }
                    while (!(Digitos.Length == 4) || !int.TryParse(Digitos, out isNum));

                    // Code for Un-Checked state
                    ButtonTA_Tarjeta.IsChecked = true;
                    TextBox_Importe.IsEnabled = false;
                    ComboTarjetas.IsEnabled = true;
                    TextBox_Importe.Text = TextBox_Total.Text;
                }
            }            
        }

        private void ButtonTA_Tarjeta_Checked_1(object sender, RoutedEventArgs e)
        {
            if (ButtonTA_Efectivo != null)
            {
                if ((bool)(sender as ToggleButton).IsChecked)
                {
                    int isNum;
                    do
                    {
                        Digitos = Microsoft.VisualBasic.Interaction.InputBox("Favor de insertar los últimos 4 dígitos de la tarjeta con la que se va a cobrar", "Dígitos tarjeta","");
                        if (String.IsNullOrEmpty( Digitos.Trim()))
                        {
                            return;
                        }
                    }
                    while (!(Digitos.Length == 4) || !int.TryParse(Digitos, out isNum));
                    
                    // Code for Checked state
                    ButtonTA_Efectivo.IsChecked = false;

                    ComboTarjetas.IsEnabled = true;
                    TextBox_Importe.IsEnabled = false;
                    TextBox_Importe.Text = TextBox_Total.Text;
                }
                else
                {                    
                    // Code for Un-Checked state
                    ButtonTA_Efectivo.IsChecked = true;
                    TextBox_Importe.IsEnabled = true;
                    ComboTarjetas.IsEnabled = false;
                }        
            }            
        }

        private void Combo_ArticulosAutoComplete_KeyUp_1(object sender, KeyEventArgs e)
        {
            if (e.Key != System.Windows.Input.Key.Enter) return;

            if (!_IsOpenMessageBox)
            {
                CAutocomplete MiAux = (CAutocomplete)Combo_ArticulosAutoComplete.SelectedItem;

                if (Combo_ArticulosAutoComplete.SelectedItem != null)
                {
                    DataTable dt_cat_a = cat_a.Get_Articulos_PuntoVenta_By_Id(Int32.Parse(MiAux.Id));

                    ArticuloGrid_PV aux = new ArticuloGrid_PV();
                    aux.Cantidad = Double.Parse(TextBox_Cantidad.Text);
                    aux.Id_Articulo = Int32.Parse(dt_cat_a.Rows[0]["Id_Articulo"].ToString());
                    aux.PrecioUnitario = Math.Round(Double.Parse(dt_cat_a.Rows[0]["Precio_Lista"].ToString()) / Double.Parse(dt_cat_a.Rows[0]["Desc_TipoCambio"].ToString()),2);
                    aux.Producto = dt_cat_a.Rows[0]["NombreTicket"].ToString();
                    aux.Porc_IVA = Double.Parse(dt_cat_a.Rows[0]["Desc_IVA"].ToString());
                    aux.Total = Math.Round(aux.PrecioUnitario * aux.Cantidad, 2);

                    TextBox_Total.Text = (Double.Parse(TextBox_Total.Text, NumberStyles.Currency) + aux.Total).ToString("C");
                    TextBox_SubTotal.Text = (Double.Parse(TextBox_SubTotal.Text, NumberStyles.Currency) + Math.Round((aux.Total * ((100 - aux.Porc_IVA) / 100)), 2)).ToString("C");

                    DatosDataGrid.Items.Add(aux);

                    TextBox_Cantidad.Text = "1";
                    Combo_ArticulosAutoComplete.SelectedItem = null;

                    Combo_ArticulosAutoComplete.Focus();
                }
                else
                {
                    MessageBox.Show("Favor de seleccionar un artículo existente.");
                    _IsOpenMessageBox = true;
                }
            }
            else 
            {
                _IsOpenMessageBox = false;
            }
        }

        public void Show(string messageBoxText)
        {
            _IsOpenMessageBox = true;
            MessageBoxResult myDialogResult = MessageBox.Show("My text here", "My caption here", MessageBoxButton.OK);
            _IsOpenMessageBox = false;
        }

        private void Button_Cancelar_Click(object sender, RoutedEventArgs e)
        {
            LimpiarPantalla();
        }

        private void LimpiarPantalla() 
        {
            DatosDataGrid.Items.Clear();
            CargarDatos();
            ButtonTA_Efectivo.IsChecked = true;
            TextBox_Cantidad.Text = "1";            
            TextBox_Total.Text = "$0.00";
            TextBox_SubTotal.Text = "$0.00";
            TextBox_Importe.Text = "";
            Combo_ArticulosAutoComplete.Focus();
        }

        private void Button_Productos5_Click_1(object sender, RoutedEventArgs e)
        {
            ArticuloGrid_PV aux = new ArticuloGrid_PV();
            aux.Cantidad = Double.Parse(TextBox_Cantidad.Text);
            aux.Id_Articulo = Articulo_Frecuente5.Id_Articulo;
            aux.PrecioUnitario = Articulo_Frecuente5.Precio_Lista;
            aux.Producto = Articulo_Frecuente5.NombreTicket;
            aux.Total =  Math.Round(aux.PrecioUnitario * aux.Cantidad, 2);
            aux.Porc_IVA = Articulo_Frecuente5.Porc_IVA;

            TextBox_Total.Text = (Double.Parse(TextBox_Total.Text, NumberStyles.Currency) + aux.Total).ToString("C");
            TextBox_SubTotal.Text = (Double.Parse(TextBox_SubTotal.Text, NumberStyles.Currency) + Math.Round((aux.Total * ((100 - Articulo_Frecuente5.Porc_IVA) / 100)), 2)).ToString("C");            

            DatosDataGrid.Items.Add(aux);

            TextBox_Cantidad.Text = "1";
            Combo_ArticulosAutoComplete.Focus();
        }

        private void Button_Productos4_Click_1(object sender, RoutedEventArgs e)
        {
            ArticuloGrid_PV aux = new ArticuloGrid_PV();
            aux.Cantidad = Double.Parse(TextBox_Cantidad.Text);
            aux.Id_Articulo = Articulo_Frecuente4.Id_Articulo;
            aux.PrecioUnitario = Articulo_Frecuente4.Precio_Lista;
            aux.Producto = Articulo_Frecuente4.NombreTicket;
            aux.Total =  Math.Round(aux.PrecioUnitario * aux.Cantidad, 2);
            aux.Porc_IVA = Articulo_Frecuente4.Porc_IVA;

            TextBox_Total.Text = (Double.Parse(TextBox_Total.Text, NumberStyles.Currency) + aux.Total).ToString("C");
            TextBox_SubTotal.Text = (Double.Parse(TextBox_SubTotal.Text, NumberStyles.Currency) + Math.Round((aux.Total*((100-Articulo_Frecuente4.Porc_IVA)/100)), 2)).ToString("C");            

            DatosDataGrid.Items.Add(aux);

            TextBox_Cantidad.Text = "1";
            Combo_ArticulosAutoComplete.Focus();
        }

        private void Button_Productos3_Click_1(object sender, RoutedEventArgs e)
        {
            ArticuloGrid_PV aux = new ArticuloGrid_PV();
            aux.Cantidad = Double.Parse(TextBox_Cantidad.Text);
            aux.Id_Articulo = Articulo_Frecuente3.Id_Articulo;
            aux.PrecioUnitario = Articulo_Frecuente3.Precio_Lista;
            aux.Producto = Articulo_Frecuente3.NombreTicket;
            aux.Total =  Math.Round(aux.PrecioUnitario * aux.Cantidad, 2);
            aux.Porc_IVA = Articulo_Frecuente3.Porc_IVA;

            TextBox_Total.Text = (Double.Parse(TextBox_Total.Text, NumberStyles.Currency) + aux.Total).ToString("C");
            TextBox_SubTotal.Text = (Double.Parse(TextBox_SubTotal.Text, NumberStyles.Currency) + Math.Round((aux.Total * ((100 - Articulo_Frecuente3.Porc_IVA) / 100)), 2)).ToString("C");            

            DatosDataGrid.Items.Add(aux);

            TextBox_Cantidad.Text = "1";
            Combo_ArticulosAutoComplete.Focus();
        }

        private void Button_Productos2_Click_1(object sender, RoutedEventArgs e)
        {
            ArticuloGrid_PV aux = new ArticuloGrid_PV();
            aux.Cantidad = Double.Parse(TextBox_Cantidad.Text);
            aux.Id_Articulo = Articulo_Frecuente2.Id_Articulo;
            aux.PrecioUnitario = Articulo_Frecuente2.Precio_Lista;
            aux.Producto = Articulo_Frecuente2.NombreTicket;
            aux.Total =  Math.Round(aux.PrecioUnitario * aux.Cantidad, 2);
            aux.Porc_IVA = Articulo_Frecuente2.Porc_IVA;

            TextBox_Total.Text = (Double.Parse(TextBox_Total.Text, NumberStyles.Currency) + aux.Total).ToString("C");
            TextBox_SubTotal.Text = (Double.Parse(TextBox_SubTotal.Text, NumberStyles.Currency) + Math.Round((aux.Total * ((100 - Articulo_Frecuente2.Porc_IVA) / 100)), 2)).ToString("C");            

            DatosDataGrid.Items.Add(aux);
            
            TextBox_Cantidad.Text = "1";
            Combo_ArticulosAutoComplete.Focus();
        }

        private void Button_Productos1_Click_1(object sender, RoutedEventArgs e)
        {
            ArticuloGrid_PV aux = new ArticuloGrid_PV();
            aux.Cantidad = Double.Parse(TextBox_Cantidad.Text);
            aux.Id_Articulo = Articulo_Frecuente1.Id_Articulo;
            aux.PrecioUnitario = Articulo_Frecuente1.Precio_Lista;
            aux.Producto = Articulo_Frecuente1.NombreTicket;
            aux.Total =  Math.Round(aux.PrecioUnitario * aux.Cantidad,2);
            aux.Porc_IVA = Articulo_Frecuente1.Porc_IVA;

            TextBox_Total.Text = (Double.Parse(TextBox_Total.Text, NumberStyles.Currency) + aux.Total).ToString("C");
            TextBox_SubTotal.Text = (Double.Parse(TextBox_SubTotal.Text, NumberStyles.Currency) + Math.Round((aux.Total * ((100 - Articulo_Frecuente1.Porc_IVA) / 100)), 2)).ToString("C");            

            DatosDataGrid.Items.Add(aux);

            TextBox_Cantidad.Text = "1";
            Combo_ArticulosAutoComplete.Focus();
        }

        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            ArticuloGrid_PV obj = ((FrameworkElement)sender).DataContext as ArticuloGrid_PV;

            for (int i = 0; i < DatosDataGrid.Items.Count; i++)
            {
                if (((ArticuloGrid_PV)DatosDataGrid.Items[0]).Cantidad == obj.Cantidad &&
                   ((ArticuloGrid_PV)DatosDataGrid.Items[0]).Id_Articulo == obj.Id_Articulo &&
                   ((ArticuloGrid_PV)DatosDataGrid.Items[0]).PrecioUnitario == obj.PrecioUnitario &&
                   ((ArticuloGrid_PV)DatosDataGrid.Items[0]).Producto == obj.Producto &&
                   ((ArticuloGrid_PV)DatosDataGrid.Items[0]).Total == obj.Total
                )
                {
                    DatosDataGrid.Items.RemoveAt(i);

                    TextBox_Total.Text = (Double.Parse(TextBox_Total.Text, NumberStyles.Currency) - obj.Total).ToString("C");
                    TextBox_SubTotal.Text = (Double.Parse(TextBox_SubTotal.Text, NumberStyles.Currency) - Math.Round((obj.Total * ((100 - obj.Porc_IVA) / 100)), 2)).ToString("C");

                    break;
                }
            }
        }

        private void Button_Finalizar_Click(object sender, RoutedEventArgs e)
        {
            if(ComboTarjetas.SelectedItem == null && (bool)ButtonTA_Tarjeta.IsChecked)
            {
                MessageBox.Show("Para cobrar con tarjeta es necesario dar de alta un tipo de tarjeta desde el catálogo Tarjetas de Crédito en Bancos.");
                return;
            }

            try { Double.Parse(TextBox_Importe.Text.Replace('$',' ').Trim()); }
            catch (Exception)
            {
                MessageBox.Show("Favor de ingresar un importe válido.");
                return;
            }

            Double Cambio = 0.0;
            if (ButtonTA_Efectivo.IsChecked == true)
            {
                // Checamos que el importe sea suficiente
                var Importe = Double.Parse(TextBox_Importe.Text.Replace('$',' ').Trim());
                var Total = Double.Parse(TextBox_Total.Text.Substring(1));
                if (Importe < Total)
                {
                    MessageBox.Show("Importe insuficiente.");
                    return;
                }
                Cambio = Importe - Total;
            }

            var cat_t = new SIIE_ERP.BaseDatos.PuntoVenta.Catalogos.dbo_Cat_Terminal(_sesion.RFC, _sesion.UserName);
            var cat_ticket = new SIIE_ERP.BaseDatos.PuntoVenta.Transacciones.dbo_Tickets(_sesion.RFC, _sesion.UserName);
            var cat_TC = new SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_BancoTC(_sesion.RFC, _sesion.UserName);
            var cat_mon = new SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_Moneda(_sesion.RFC, _sesion.UserName);
            var cat_art = new SIIE_ERP.BaseDatos.Inventarios.Catalogos.dbo_Cat_Articulo(_sesion.RFC, _sesion.UserName);

            int Id_Cuenta;            

            if((bool)ButtonTA_Efectivo.IsChecked)
            {
                Id_Cuenta = Int32.Parse(cat_t.Get_Terminal_Por_Id(_sesion.PV_Id_Terminal).Rows[0]["Id_CuentaBancaria"].ToString());
                //Movimiento a cuenta
                var db = new SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_Cuenta_Bancaria(_sesion.RFC, _sesion.UserName);
                db.Update_Saldo_Cuenta_Bancaria_Por_Id(Id_Cuenta, Double.Parse(TextBox_Total.Text, NumberStyles.Currency));
            }
            else
            {
                DataTable Aux_dt_TC = cat_TC.Get_BancoTC_Por_Id(((CItem)ComboTarjetas.SelectedItem).Id);

                Id_Cuenta = Int32.Parse(Aux_dt_TC.Rows[0]["Id_Cuenta"].ToString());

                //Movimiento a cuenta
                var db = new SIIE_ERP.BaseDatos.Bancos.Catalogos.dbo_Cat_Cuenta_Bancaria(_sesion.RFC, _sesion.UserName);

                if (Double.Parse(Aux_dt_TC.Rows[0]["TopeVentas"].ToString()) <= Double.Parse( db.Get_Cuenta_Bancaria_Por_Id(Id_Cuenta).Rows[0]["Saldo"].ToString()))
                    db.Update_Saldo_Cuenta_Bancaria_Por_Id(Id_Cuenta, Double.Parse(TextBox_Total.Text, NumberStyles.Currency));
                else
                    db.Update_Saldo_Cuenta_Bancaria_Por_Id(Id_Cuenta, Math.Round(Double.Parse(TextBox_Total.Text, NumberStyles.Currency) * ((100 - Double.Parse(Aux_dt_TC.Rows[0]["PocentajeAplicacionCuenta"].ToString()))/100), 2));
            }

            Id_Apertura = Int32.Parse(cat_t.Get_Terminal_Abierta()["Id_Apertura"].ToString());

            int Id_Ticket_Padre = cat_ticket.NextTicket();

            if (cat_ticket.Insert_Ticket_Cab(
                Id_Ticket_Padre,
                TicketNo,
                EstatusDocs_Id.Estatus_Doc_Asentado,
                Id_Cuenta,
                Int32.Parse(cat_t.Get_Terminal_Por_Id(_sesion.PV_Id_Terminal).Rows[0]["Id_Almacen"].ToString()),
                Digitos,
                _sesion.PV_Id_Terminal,
                Int32.Parse(cat_mon.Get_Moneda_Por_Nombre("Pesos Mexicanos").Rows[0]["Id_Moneda"].ToString()),
                Id_Apertura,
                (bool)ButtonTA_Efectivo.IsChecked,
                ""
            ).Id != 1)
                MessageBox.Show("ERROR");

            int Almacen_Id = Int32.Parse(cat_t.Get_Terminal_Por_Id(_sesion.PV_Id_Terminal).Rows[0]["Id_Almacen"].ToString());

            /////////////////////////////////////   Insertar Movimiento de Inventario ya asentado
            SIIE_ERP.BaseDatos.Inventarios.Transacciones.Trans_MovInv MiTrans_MovInv = new SIIE_ERP.BaseDatos.Inventarios.Transacciones.Trans_MovInv(_sesion.RFC, _sesion.UserName);
            MiTrans_MovInv.Insert_Trans_MovInv_Cab(
                EstatusDocs_Id.Estatus_Doc_Asentado,
                DateTime.Today,
                "Ticket de Punto de Venta " + TicketNo,
                MiTrans_MovInv.Get_TipoInventarioPV(),
                "",
                Almacen_Id,
                null,
                null,
                0
            );

            int Id_MiTrans_MovInv = MiTrans_MovInv.Get_LastIdMovInventario();

            foreach (ArticuloGrid_PV a in DatosDataGrid.Items)
            {
                Respuesta r_linea = cat_ticket.Insert_Ticket_Linea(
                    Id_Ticket_Padre,
                    a.Id_Articulo,
                    a.Cantidad,
                    a.PrecioUnitario,
                    0,
                    0,
                    Math.Round((a.Total * ((100 - a.Porc_IVA) / 100)), 2),
                    a.Porc_IVA,
                    Math.Round(a.Porc_IVA * a.Total / 100.0, 2),
                    a.Total
                );

                if (cat_art.Get_Articulo_Por_Id(a.Id_Articulo).Rows[0]["Tipo_Articulo"].ToString().Equals("1"))
                {
                    if (Documentos_InventariosExistencias.ActualizaInserta_Existencia(
                        _sesion.RFC,
                        _sesion.UserName,
                        Almacen_Id,
                        Int32.Parse(a.Id_Articulo.ToString()),
                        a.Cantidad * -1).Id != 1)
                    {
                        MessageBox.Show("ERROR");
                        return;
                    }

                    MiTrans_MovInv.Insert_Trans_MovInv_Linea(
                        Id_MiTrans_MovInv,
                        Int32.Parse(a.Id_Articulo.ToString()),
                        a.Cantidad * -1,
                        ""
                    );
                }
                else if (cat_art.Get_Articulo_Por_Id(a.Id_Articulo).Rows[0]["Tipo_Articulo"].ToString().Equals("3"))
                {
                    dbo_Cat_Kit_Detalle Kit_D = new dbo_Cat_Kit_Detalle(_sesion.RFC, _sesion.UserName);
                    var dt_Kit = Kit_D.Get_Kit_Detalle_Por_Id(Int32.Parse(a.Id_Articulo.ToString())).Rows;

                    foreach (DataRow d_Kit in dt_Kit)
                    {
                        if (d_Kit["Tipo_Articulo"].ToString().Equals("1"))
                        {
                            if (Documentos_InventariosExistencias.ActualizaInserta_Existencia(
                            _sesion.RFC,
                            _sesion.UserName,
                            Almacen_Id,
                            Int32.Parse(d_Kit["Id_Articulo_Hijo"].ToString()),
                            a.Cantidad * Double.Parse(d_Kit["Cantidad"].ToString()) * -1).Id != 1)
                            {
                                MessageBox.Show("ERROR");
                                return;
                            }

                            MiTrans_MovInv.Insert_Trans_MovInv_Linea(
                                Id_MiTrans_MovInv,
                                Int32.Parse(d_Kit["Id_Articulo_Hijo"].ToString()),
                                a.Cantidad * Double.Parse(d_Kit["Cantidad"].ToString()) * -1,
                                ""
                            );
                        }
                    }
                }
            }

            MessageBox.Show("Cambio: " + Cambio.ToString("C"));

            ////////////////////////////   Impresión del Ticket
            PrintDialog dialog = new PrintDialog();

            string s = "";

            s += Label_Encabezado.Text
                    + "\n\n"
                    + "------------------------------"
                    + "\n\n";

            foreach (ArticuloGrid_PV a in DatosDataGrid.Items)
            {
                int Len = a.Cantidad.ToString().Length;
                
                s += a.Cantidad.ToString();

                if (Len == 4)
                    s += " ";
                else if (Len == 3)
                    s += "  ";
                else if (Len == 2)
                    s += "   ";
                else if (Len == 1)
                    s += "    ";

                s += a.Producto;

                for(int i = 0;  i < 13 - a.Producto.Length; i++)
                {
                    s += " ";
                }

                s += a.Total.ToString("C");
                s += "\n";
            }

            s += "\n\n";

            if ((bool)ButtonTA_Efectivo.IsChecked)
                s += "Forma de Pago: Efectivo\n";
            else
                s += "Forma de Pago: Tarjeta\n";

            s += "Subtotal: " + TextBox_SubTotal.Text + "\n";
            s += "IVA: " + (Double.Parse(TextBox_Total.Text, NumberStyles.Currency) - Double.Parse(TextBox_SubTotal.Text, NumberStyles.Currency)).ToString("C") + "\n";
            s += "Total: " + TextBox_Total.Text + "\n" + "\n";

            var tb = new TextBlock
            {
                FontFamily= new FontFamily("Consolas"),
                Text = s
            };
            codigoAddon = "";
            CodigoBarra = "";
            CodigoBarra = TicketNo.Substring(0, 12);
            codigoAddon = TicketNo.Substring(12);
            string m_final = "";
           // m_final =  EANTrece(CodigoBarra) + AddOn(codigoAddon);
            m_final = TicketNo;
            var tb2 = new TextBlock { FontFamily = new FontFamily("EanBwrP36Tt"), FontSize = 40, Text = m_final };

           //var tb2 = new TextBlock { FontFamily = new FontFamily("Code EAN13"), FontSize = 44, Text = m_final };

            //var tb3 = new TextBlock
            //{
            //    FontFamily = new FontFamily("Consolas"),
            //    Text = TicketNo
            //};

            tb.Inlines.Add(tb2);
            //tb.Inlines.Add("\n");
            //tb.Inlines.Add(tb3);
            dialog.PrintVisual(tb, "");
            LimpiarPantalla();
            
            ////////////////////////////   FIN
        }
        public object EANTrece(string valor)
        {
            object functionReturnValue = null;
            int i;
            int m_validador = 0;
            int m_primero;
            string CodigoBarra;
            bool tableA;
            functionReturnValue = "";
            if (valor.Length == 12)
            {
                for (i = 1; i <= 12; i++)
                {
                    int L1 = Convert.ToChar(valor.Substring(i - 1, 1));
                    if (L1 < 48 || L1 > 57)
                    {
                        i = 0;
                        break;
                    }
                }
                if (i == 13)
                {
                    for (i = 12; i >= 1; i += -2)
                    {
                        m_validador = m_validador + Convert.ToInt32(valor.Substring(i - 1, 1));
                    }
                    m_validador = m_validador * 3;
                    for (i = 11; i >= 1; i += -2)
                    {
                        m_validador = m_validador + Convert.ToInt32(valor.Substring(i - 1, 1));
                    }
                    valor = valor + (10 - m_validador % 10) % 10;
                    CodigoBarra = valor.Substring(0, 1) + Convert.ToChar(65 + Convert.ToInt32((valor.Substring(1, 1))));
                    m_primero = Convert.ToInt32(valor.Substring(0, 1));

                    for (i = 3; i <= 7; i++)
                    {
                        tableA = false;
                        switch (i)
                        {
                            case 3:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 1:
                                    case 2:
                                    case 3:
                                        tableA = true;
                                        break;
                                }
                                break;
                            case 4:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 4:
                                    case 7:
                                    case 8:
                                        tableA = true;
                                        break;
                                }
                                break;
                            case 5:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 1:
                                    case 4:
                                    case 5:
                                    case 9:
                                        tableA = true;
                                        break;
                                }
                                break;
                            case 6:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 2:
                                    case 5:
                                    case 6:
                                    case 7:
                                        tableA = true;
                                        break;
                                }
                                break;
                            case 7:
                                switch (m_primero)
                                {
                                    case 0:
                                    case 3:
                                    case 6:
                                    case 8:
                                    case 9:
                                        tableA = true;
                                        break;
                                }
                                break;
                        }
                        if (tableA)
                        {
                            CodigoBarra = CodigoBarra + Convert.ToChar(65 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                        }
                        else
                        {
                            CodigoBarra = CodigoBarra + Convert.ToChar(75 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                        }
                    }
                    CodigoBarra = CodigoBarra + "*";
                    for (i = 8; i <= 13; i++)
                    {
                        CodigoBarra = CodigoBarra + Convert.ToChar(97 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                    }
                    CodigoBarra = CodigoBarra + "+";
                    functionReturnValue = CodigoBarra;
                }
            }
            return functionReturnValue;
        }

        public string AddOn(string valor)
        {
            int i;
            int checksum = 0;
            string AddOnn = "";

            bool tableA;

            if (valor.Length == 2 || valor.Length == 5)
            {
                for (i = 1; i < valor.Length; i++)
                {
                    int L1 = Convert.ToChar(valor.Substring(i - 1, 1));

                    if (L1 < 48 || L1 > 57)
                    {
                        break;
                    }
                    if (valor.Length == 2)
                    {
                        checksum = 10 + Convert.ToInt32(valor) % 4;
                    }
                    else if (valor.Length == 5)
                    {
                        for (i = 1; i == 5; i = i - 2)
                        {
                            checksum = checksum + Convert.ToInt32(valor.Substring(i - 1, 1));
                        }
                        checksum = (checksum * 3 + Convert.ToInt32(valor.Substring(2, 1)) * 9 + Convert.ToInt32(valor.Substring(4, 1)) * 9) % 10;
                    }
                    AddOnn = "[";
                    for (i = 1; i <= valor.Length; i++)
                    {
                        tableA = false;

                        switch (i)
                        {
                            case 1:
                                int[] str = { 4, 9, 10, 11 };
                                for (int j = 0; j < str.Length; j++)
                                {
                                    if (str[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;

                            case 2:
                                int[] str1 = { 1, 2, 3, 5, 6, 7, 10, 12 };
                                for (int j = 0; j < str1.Length; j++)
                                {
                                    if (str1[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;
                            case 3:
                                int[] str2 = { 0, 2, 3, 6, 7 };
                                for (int j = 0; j < str2.Length; j++)
                                {
                                    if (str2[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;
                            case 4:
                                int[] str3 = { 1, 3, 4, 8, 9 };
                                for (int j = 0; j < str3.Length; j++)
                                {
                                    if (str3[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;
                            case 5:
                                int[] str4 = { 0, 1, 2, 4, 5, 7 };
                                for (int j = 0; j < str4.Length; j++)
                                {
                                    if (str4[j] == checksum)
                                    {
                                        tableA = false;
                                        break;
                                    }
                                }
                                break;
                        }

                        if (tableA)
                            AddOnn = AddOnn + Convert.ToChar(65 + Convert.ToInt32(valor.Substring(i - 1, 1)));
                        else
                            AddOnn = AddOnn + Convert.ToChar(75 + Convert.ToInt32(valor.Substring(i - 1, 1)));

                        if ((valor.Length == 2 && i == 1) || (valor.Length == 5 && i < 5))
                            AddOnn = AddOnn + Convert.ToChar(92);

                    }


                }
            }
            return AddOnn;
        }
        private void TextBox_Cantidad_LostKeyboardFocus_1(object sender, KeyboardFocusChangedEventArgs e)
        {
            int AuxNum = 0;

            try
            {
                AuxNum = Int32.Parse(TextBox_Cantidad.Text);
            }
            catch(Exception Ex)
            {
                TextBox_Cantidad.Text = "1";
            }
        }

        private void ButtonTA_Click(object sender, RoutedEventArgs e)
        {   
            Window window = new Window 
            {
                Title = "Selección Compañía Celular",
                 Height = 430,
                 Width = 417, 
                 WindowStyle = System.Windows.WindowStyle.ToolWindow,
                 ResizeMode = System.Windows.ResizeMode.NoResize,
                 Content = new  UserControl_TA1(ref _sesion)
            };

            window.ShowDialog();

        }

        private void OnKeyDownHandler(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Return)
            {
                Button_Finalizar_Click(sender, e);
            }
        }

    }
}
